/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;



/**
 *
 * @author ThaísRamir
 */
public class FilmeDAO {
    
     private Connection conn;  //cria uma vari�vel que receber� um objeto da classe Connection

    /**
     * <p>Este � o m�todo construtor da classe. Ao construir uma inst�ncia da classe ContatoFilmeDAO ele conectata a aplica��o com o banco de dados. Para isso,
 ele chama o m�todo getConnection da classe Conex�o.<p>
     */
    public FilmeDAO(){
        if( (conn = new Conexao().getConnection())== null ){
            JOptionPane.showMessageDialog(null, "Não conectou o banco de dados.");
        }
    }
    
    /**
     * <p>Este m�todo realiza a opera��o de INSERT no banco de dados. Ele recebe os dados armazenados em um objeto da classe Contato 
     * e os insere na tabela contatos.</p>
     * @param contato 
     */
    public void inserir(Filme filme) {
        String sql = "INSERT INTO filme " +            //aqui estamos criando uma String com o comando SQL.
        "(tit_filme, dur_filme,categoria, genero)" +
        " VALUES (?,?,?,?)";
        try 
            (PreparedStatement pstmt = this.conn.prepareStatement(sql)) //utilizamos um objeto PreparedStatement para realizar a opera��o
        {
                
                pstmt.setString(1,filme.getTitulo_filme());   //chamamos o m�todo apropriado do objeto PreparedStatement para copiar os dados do objeto contato
                pstmt.setLong(2,filme.getDuracao_filme());
                pstmt.setString(3,filme.getCategoria());
                pstmt.setString(4,filme.getGenero());
                
               
                if(!pstmt.execute()){ //executa o INSERT
                    JOptionPane.showMessageDialog(null, "Filme inserido com sucesso!");
                }
                
                pstmt.close();  //n�o podemos esquecer de liberar este recurso
                    
        } catch (SQLException ex){ //se a conex�o falhar, emite a mensagem abaixo
            System.out.println("SQLException em adicionar!!!" + "Erro detectado: " + ex.getMessage());
        }
        //como utiliza try-with-resource o recurso stmt � fechado automaticamente
    }
    
    
    /**
     * <p>Este m�todo realiza a opera��o de DELETE no banco de dados. Ele recebe a chave de um registro cadastrado no banco de dados e realiza a opera��o.</p>
     * @param id 
     */
    public void excluir(int id){
        String sql = "DELETE FROM filme WHERE cod_filme = " + id;  //aqui estamos criando uma String com o comando SQL.
        try 
            (Statement stmt = this.conn.createStatement()) //utilizamos um objeto Statement para realizar a opera��o
        {
                if(stmt.executeUpdate(sql) == 1){ //executa o DELETE
                    JOptionPane.showMessageDialog(null, "Filme excluido com sucesso!");
                }
                
                stmt.close();  //n�o podemos esquecer de liberar este recurso
                    
        } catch (SQLException ex) { //se a conex�o falhar, emite a mensagem abaixo
            System.out.println("SQLException em excluir!!!" + "Erro detectado: " + ex.getMessage());
        }
        //como utiliza try-with-resource o recurso stmt � fechado automaticamente

    }
    
    /**
     * <p>Este m�todo realiza a opera��o de UPDATE no banco de dados. Ele recebe os dados armazenados em um objeto da classe Contato 
     * e os altera na tabela contatos.</p>
     * @param filme 
     */
    public void alterar(Filme filme){
        String sql = "UPDATE filme SET " +         //aqui estamos criando uma String com o comando SQL.
                        "tit_filme=?,dur_filme=?, categoria=?, genero=?" + 
                        "WHERE cod_filme=?";
        
        try
            (PreparedStatement pstmt = this.conn.prepareStatement(sql))  //utilizamos um objeto PreparedStatement para realizar a opera��o
        {
                pstmt.setLong(5,filme.getCod_filme()); 
                System.out.println (filme.getCod_filme());
                pstmt.setString(1,filme.getTitulo_filme());   //chamamos o m�todo apropriado do objeto PreparedStatement para preparar a execu��o do comando SQL
                pstmt.setLong(2,filme.getDuracao_filme());
                pstmt.setString(3,filme.getCategoria());
                pstmt.setString(4,filme.getGenero());
                if(pstmt.executeUpdate() != 0){ //executa o UPDATE
                    JOptionPane.showMessageDialog(null, "Contato alterado com sucesso.");
                }
                
               
            
        }catch(SQLException ex){  //se a conex�o falhar, emite a mensagem abaixo
          System.out.println("SQLException em alterar!!!" + "Erro detectado: " + ex.getMessage());
          
          //como utiliza try-with-resource o recurso stmt � fechado automaticamente
      }
        
    }
    
    /**
     * <p>Este m�todo realiza a opera��o de SELECT no banco de dados. Ele recebe um texto (o nome de um contato) cadastrado no banco de dados, faz a
     * consulta e preenche um ArrayList com os dados consultados, para, logo ap�s, retornar esse ArrayList. </p>
     * @param nome
     * @return ArrayList de objetos da classe Contato
     */
    public ArrayList<Filme> consultar(String nome){
        
        String sql = "SELECT * FROM filme WHERE tit_filme " + "LIKE '" + nome + "%' ORDER BY tit_filme";  //aqui estamos criando uma String com o comando SQL.
        ArrayList<Filme> filmes = new ArrayList<>(); //constr�i um objeto da classe ArrayList, um array automaticamente dimension�vel em tempo de execu��o
        Filme filme; //declara uma vari�vel para receber um objeto da classe Contato
        
        try
            (Statement stmt = this.conn.createStatement(); //utilizamos um objeto Statement para realizar a opera��o
             ResultSet rs = stmt.executeQuery(sql);) //executamos o m�todo executeQuery do objeto PreparedStatement no banco de dados e
                                                     //ele nos retorna um objeto ResultSet, com todos os dados retornados da consulta.
        {
            while (rs.next()) { //move o cursor para a pr�xima linha do ResultSet, varrendo todo o objeto ResultSet
                filme = new Filme(); //esvazia o objeto film
                filme.setCod_filme(rs.getInt("cod_filme"));
                filme.setTitulo_filme(rs.getString("tit_filme"));
                filme.setDuracao_filme(rs.getLong("dur_filme"));
                filme.setCategoria(rs.getString("categoria"));
                filme.setGenero(rs.getString("genero"));
                filmes.add(filme); //insere um contato no arrayList
            }
                stmt.close();   //n�o podemos esquecer de liberar este recurso
                rs.close();     //n�o podemos esquecer de liberar este recurso
                return filmes; //retorna o arrayList
        } catch (SQLException ex) { //se a conex�o falhar, emite a mensagem abaixo
            System.out.println("SQLException em consultar!!!" + "Erro detectado: " + ex.getMessage());
            return null;

            //como utiliza try-with-resource o recurso stmt � fechado automaticamente
        }
         
    }
    
    /**
     * <p>Este m�todo realiza a opera��o de SELECT no banco de dados e gera uma listagem com todos os contados cadastrados.</p>
     * @param tbConsultar 
     */
     public ArrayList<Filme> listar(){
       
        String sql = "SELECT * FROM filme ORDER BY tit_filme";
        
        ArrayList<Filme> filmes = new ArrayList<>(); //constrói um objeto da classe ArrayList, um array automaticamente dimensionável em tempo de execução
        Filme filme; //declara uma variável para receber um objeto da classe Contato
        
        try
            (Statement stmt = this.conn.createStatement(); //utilizamos um objeto Statement para realizar a operação
             ResultSet rs = stmt.executeQuery(sql);) //executamos o método executeQuery do objeto PreparedStatement no banco de dados e
                                                     //ele nos retorna um objeto ResultSet, com todos os dados retornados da consulta.
        {
            while (rs.next()) { //move o cursor para a próxima linha do ResultSet, varrendo todo o objeto ResultSet
                filme = new Filme(); //esvazia o objeto contato
                
                filme.setCod_filme(rs.getInt("cod_filme"));
                filme.setTitulo_filme(rs.getString("tit_filme"));
                filme.setDuracao_filme(rs.getLong("dur_filme"));
                filme.setCategoria(rs.getString("Categoria"));
                filme.setGenero(rs.getString("Genero"));
                filmes.add(filme); //insere um contato no arrayList
            }
                stmt.close();   //não podemos esquecer de liberar este recurso
                rs.close();     //não podemos esquecer de liberar este recurso
                return filmes; //retorna o arrayList
        } catch (SQLException ex) { //se a conexão falhar, emite a mensagem abaixo
            System.out.println("SQLException em consultar!!!" + "Erro detectado: " + ex.getMessage());
            return null;

            //como utiliza try-with-resource o recurso stmt é fechado automaticamente
        }
    }

   
   
   
        
    
    
   
}
